package br.com.documentos.controller;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

import br.com.documentos.model.entity.Arquivo;
import br.com.documentos.model.entity.Documento;
import br.com.documentos.model.entity.ParametroDocumentoUsuario;
import br.com.documentos.model.entity.TipoDocumentoUsuario;
import br.com.documentos.model.entity.ValorParametroDocumento;
import br.com.documentos.model.service.DocumentoService;
import br.com.documentos.model.service.TipoDocumentoService;

@ManagedBean
@SessionScoped
public class UploadDocumentoMB extends ManagerBeanBase {

	private static final long serialVersionUID = 1L;

	@ManagedProperty("#{tipoDocumentoService}")
	private TipoDocumentoService tipoDocumentoService;
	
	@ManagedProperty("#{documentoService}")
	private DocumentoService documentoService; 
	
	private Long idTipoDocumento;  
	
	private Documento documento = new Documento();
		
	public void tiposDocumentoSelected()
	{
		documento.getParametros().clear();

		TipoDocumentoUsuario tipoDoc = tipoDocumentoService.carregarTipoDocumentoPorId(idTipoDocumento);
		
		documento.setTipoDocumento(tipoDoc);
		
		for( ParametroDocumentoUsuario parametro : tipoDoc.getParametros() ){
			documento.addValorParametro( new ValorParametroDocumento(null,documento,parametro) );
		}
	}
	
	public void salvar(){
		try
		{
			documentoService.atualizarDocumento(documento);
		}
		catch (Exception e) {
			addError("Erro ao salvar parâmetros", e);
		}
	}
	
    public StreamedContent getFile() throws IOException {  
    	ByteArrayInputStream inputStream = new ByteArrayInputStream( documento.getArquivo().getBytes() );
    	
    	return new DefaultStreamedContent(inputStream, null , documento.getArquivo().getNome() );
    }
	
	public void uploadConcluido(FileUploadEvent event){
		try{
			Arquivo arquivo = new Arquivo();
			arquivo.setNome(event.getFile().getFileName());
			arquivo.setBytes(event.getFile().getContents());
			
			documento.setUsuario(getUsuario());
			documento.setArquivo(arquivo);
			
			documentoService.cadastrarDocumento(documento);
		}
		catch (Exception e) {
			addError("Erro no envio do arquivo", e );
		}
	}
	
	public List<TipoDocumentoUsuario> getTiposDocumento(){
		return tipoDocumentoService.buscarTiposDocumentoPorUsuario( getUsuario().getId() );
	}

	public TipoDocumentoService getTipoDocumentoService() {
		return tipoDocumentoService;
	}

	public void setTipoDocumentoService(TipoDocumentoService tipoDocumentoService) {
		this.tipoDocumentoService = tipoDocumentoService;
	}

	public Long getIdTipoDocumento() {
		return idTipoDocumento;
	}

	public void setIdTipoDocumento(Long idTipoDocumento) {
		this.idTipoDocumento = idTipoDocumento;
	}

	public DocumentoService getDocumentoService() {
		return documentoService;
	}

	public void setDocumentoService(DocumentoService documentoService) {
		this.documentoService = documentoService;
	}

	public Documento getDocumento() {
		return documento;
	}

	public void setDocumento(Documento documento) {
		this.documento = documento;
	}
	
}
